widget: Track if a child needs an allocation
authorBenjamin Otte <otte@redhat.com>
Tue, 29 Sep 2015 19:04:07 +0000 (21:04 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 28 Oct 2015 18:44:28 +0000 (19:44 +0100)
This is not used so far.

gtk/gtkwidget.c
gtk/gtkwidgetprivate.h

index 029fa63684306123e0eb390be0ceb7228a5a6e1a..fee05a7675e9f8741a4fee7315478ba7b4bf60c2 100644 (file)
@@ -4328,6 +4328,7 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class)
   priv->double_buffered = TRUE;
   priv->redraw_on_alloc = TRUE;
   priv->alloc_needed = TRUE;
+  priv->alloc_needed_on_child = TRUE;
  
   switch (_gtk_widget_get_direction (widget))
     {
@@ -6043,6 +6044,7 @@ gtk_widget_size_allocate_with_baseline (GtkWidget     *widget,
 #endif
   gtk_widget_ensure_resize (widget);
   priv->alloc_needed = FALSE;
+  priv->alloc_needed_on_child = FALSE;
 
   size_changed |= (old_clip.width != priv->clip.width ||
                    old_clip.height != priv->clip.height);
@@ -7167,6 +7169,7 @@ gtk_widget_draw (GtkWidget *widget,
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (!widget->priv->alloc_needed);
+  g_return_if_fail (!widget->priv->alloc_needed_on_child);
   g_return_if_fail (cr != NULL);
 
   cairo_save (cr);
@@ -16214,13 +16217,39 @@ _gtk_widget_get_alloc_needed (GtkWidget *widget)
   return widget->priv->alloc_needed;
 }
 
+static void
+gtk_widget_set_alloc_needed (GtkWidget *widget)
+{
+  GtkWidgetPrivate *priv = widget->priv;
+
+  priv->alloc_needed = TRUE;
+
+  do
+    {
+      if (priv->alloc_needed_on_child)
+        break;
+
+      priv->alloc_needed_on_child = TRUE;
+
+      if (!priv->visible)
+        break;
+
+      widget = priv->parent;
+      if (widget == NULL)
+        break;
+
+      priv = widget->priv;
+    }
+  while (TRUE);
+}
+
 void
 gtk_widget_queue_resize_on_widget (GtkWidget *widget)
 {
   GtkWidgetPrivate *priv = widget->priv;
 
   priv->resize_needed = TRUE;
-  priv->alloc_needed = TRUE;
+  gtk_widget_set_alloc_needed (widget);
 }
 
 void
index 566a562cbd3f74cee92aa110189078ef8dea642d..814524c7e2dc2ac50c99eb86664f456937d1d106 100644 (file)
@@ -73,7 +73,8 @@ struct _GtkWidgetPrivate
 
   /* Queue-resize related flags */
   guint resize_needed         : 1; /* queue_resize() has been called but no get_preferred_size() yet */
-  guint alloc_needed          : 1;
+  guint alloc_needed          : 1; /* this widget needs a size_allocate() call */
+  guint alloc_needed_on_child : 1; /* 0 or more children - or this widget - need a size_allocate() call */
 
   /* Expand-related flags */
   guint need_compute_expand   : 1; /* Need to recompute computed_[hv]_expand */